package camera.OpenGl.utils;

import android.opengl.GLES20;

/**
 * Created by Administrator on 2017/12/28.
 */

public class ShaderLoader {
    /**
     * 创建opengl程序
     * @param verTexShaderResource
     * @param fragmentShaderResource
     * @return
     */
    public  static int buildProgram(String verTexShaderResource,String fragmentShaderResource){
        //编译着色器
        int vertexShader = compileVertexShader(verTexShaderResource);
        int fragmentShader = compileFragmentShader(fragmentShaderResource);
        //连接着色器
        int program = linkProgram(vertexShader, fragmentShader);
        return program;
    }

    /**
     * 编译顶点着色器
     * @param shaderMode 着色器生成代码
     * @return
     */
    public static int compileVertexShader(String shaderMode){
        int shader = compileShader(GLES20.GL_VERTEX_SHADER, shaderMode);
        return shader;
    }

    /**
     * 编译片元着色器
     * @param shaderMode 着色器生成代码
     * @return
     */
    public static int compileFragmentShader(String shaderMode){
        int shader = compileShader(GLES20.GL_FRAGMENT_SHADER, shaderMode);
        return shader;
    }

    /**
     * 编译着色器
     * @param type 着色器的类型
     * @param shaderResource 着色器的代码资源
     * @return
     */
    public static int compileShader(int type,String shaderResource){
        //创建着色器,返回生成的着色器的id（openGl对象的引用）
        int shader = GLES20.glCreateShader(type);
        //上传着色器代码资源
        GLES20.glShaderSource(shader,shaderResource);
        //编译代码
        GLES20.glCompileShader(shader);
        return shader;
    }

    /**
     * 链接OpenGl程序 
     * @param vertexShader 顶点着色器
     * @param fragmentShader 片元着色器
     * @return
     */
    public static int linkProgram(int vertexShader,int fragmentShader){
        //创建OpenGl程序
        int program = GLES20.glCreateProgram();
        //添加着色器
        GLES20.glAttachShader(program,vertexShader);
        GLES20.glAttachShader(program,fragmentShader);
        //链接程序
        GLES20.glLinkProgram(program);
        return program;
    }
}
